package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"net/http"
)

// 创建全局的数据库连接对象
var (
	DB *gorm.DB
)

// 创建数据库连接
func initMySQL() (err error) {
	DB, err = gorm.Open("mysql", "root:123456@(127.0.0.1:3308)/gorm_db?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		return err
	}
	return DB.DB().Ping()
}

// 实体类
type Todo1 struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Status bool   `json:"status"`
}

// 遇事不决、先写注释
func main() {
	err := initMySQL()
	if err != nil {
		panic(err)
	} else {
		fmt.Print("mysql connect success")
	}
	// 延迟关闭数据库
	defer DB.Close()

	// 模型关闭，自动迁移（把结构体和数据表相对应）
	DB.AutoMigrate(&Todo1{})

	// 定义Gin的默认路由
	r := gin.Default()

	// 告诉Gin框架模板文件引用的静态文件去哪里找
	r.Static("static", "2-web-gorm/static")

	// 告诉Gin框架去哪里找模板文件
	r.LoadHTMLGlob("2-web-gorm/templates/*")

	//访问首页
	r.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	// v1 待办事项
	// 前端页面填写待办事项，点击提交就会发送请求到这里
	v1Group := r.Group("v1")

	{
		//添加
		v1Group.POST("/todo", func(context *gin.Context) {
			var todo Todo1
			context.BindJSON(&todo)
			if err := DB.Create(&todo).Error; err != nil {
				context.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
			}
			context.JSON(http.StatusOK, todo)
		})
		//查看
		v1Group.GET("/todo/:id", func(context *gin.Context) {

		})

		//查询所有
		v1Group.GET("/todo", func(context *gin.Context) {
			var todoList []Todo1
			// 查询所有数据
			err := DB.Find(&todoList).Error
			if err != nil {
				context.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
			}
			context.JSON(http.StatusOK, todoList)
		})

		//更新
		v1Group.PUT("/todo/:id", func(context *gin.Context) {
			id, ok := context.Params.Get("id")
			if !ok {
				context.JSON(http.StatusOK, gin.H{
					"err": err.Error(),
				})
			} else {
				var (
					todo Todo1
				)
				err := DB.Where("id=?", id).First(&todo).Error
				if err != nil {
					context.JSON(http.StatusOK, gin.H{
						"error": err.Error(),
					})
				} else {
					context.BindJSON(&todo)
					err := DB.Save(&todo).Error
					if err != nil {
						context.JSON(http.StatusOK, gin.H{
							"error": err.Error(),
						})
					} else {
						context.JSON(http.StatusOK, todo)
					}
				}
			}
		})

		//删除
		v1Group.DELETE("/todo/:id", func(context *gin.Context) {
			id, ok := context.Params.Get("id")
			if !ok {
				context.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
			} else {
				var todo Todo1
				err := DB.Where("id=?", id).Delete(todo)
				if err != nil {
					context.JSON(http.StatusOK, gin.H{
						"error": err.Error,
					})
				} else {
					context.JSON(http.StatusOK, todo)
				}
			}
		})
	}

	r.Run(":8081")

}
